package br.com.advance.automacao.web.relatorios.equipamento;

import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;

import org.apache.log4j.Logger;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.springframework.beans.factory.annotation.Autowired;

import br.com.advance.automacao.model.CLP;
import br.com.advance.automacao.model.Evento;
import br.com.advance.automacao.model.MTBF;
import br.com.advance.automacao.model.Turno;
import br.com.advance.automacao.services.CLPService;
import br.com.advance.automacao.services.EventoService;
import br.com.advance.automacao.services.MTBFService;
import br.com.advance.automacao.services.TurnoService;
import br.com.advance.automacao.web.utils.BaseBean;

import com.lowagie.text.Document;
import com.lowagie.text.HeaderFooter;
import com.lowagie.text.Phrase;

@ManagedBean
@ViewScoped
public class ConsultarRegistroEventosFimDeTurnoMBean extends BaseBean {

	private static final long serialVersionUID = 6065960551150505503L;

	private static final Logger logger = Logger.getLogger(ConsultarRegistroEventosFimDeTurnoMBean.class);

    private List<SelectItem> clps = new ArrayList<SelectItem>();
    private Long idCLP;
    private Long idCLPConsulta;
	private List<SelectItem> datas = new ArrayList<SelectItem>();
	private Date data;
	private Date dataConsulta;
	private List<SelectItem> turnos = new ArrayList<SelectItem>();
	private Long idTurno;
	private Long idTurnoConsulta;
	private List<Evento> eventos = new ArrayList<Evento>();
	private Double mtbf;

	@Autowired
	private CLPService clpService;
	@Autowired
	private EventoService eventoService;
	@Autowired
	private MTBFService mtbfService;
	@Autowired
	private TurnoService turnoService;



	public void initialize() {
		logger.info("initialize...");
		List<CLP> clps = clpService.buscarTodosAtivos();
		for(CLP clp : clps) {
			this.clps.add(new SelectItem(clp.getId(), clp.getNome()));
		}
	}

	public String consultar() {
		if(idCLP == null || data == null || idTurno == null) {
			eventos.clear();
			idCLPConsulta = null;
			idTurnoConsulta = null;
			dataConsulta = null;
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Todos os campos do filtro precisam ser preenchidos."));
			return "";
		}
		eventos = eventoService.buscarPorFiltro(idCLP, idTurno, data);
		idCLPConsulta = idCLP;
		idTurnoConsulta = idTurno;
		dataConsulta = data;
		List<MTBF> listMtbf = mtbfService.buscarPorFiltro(idCLP, idTurno, data);
		if(!listMtbf.isEmpty()) {
			mtbf = listMtbf.get(0).getValor();
		} else {
			mtbf = null;
		}
		return "";
	}

	public void selecionarClp() {
		this.data = null;
		this.idTurno = null;
		this.datas.clear();
		this.turnos.clear();
		if(idCLP == null) {
			return;
		}
		List<Date> datas = eventoService.buscarDataEventosPorClp(idCLP);
		DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
		for(Date data : datas) {
			this.datas.add(new SelectItem(df.format(data), df.format(data)));
		}
	}

	public void selecionarData() {
		this.idTurno = null;
		this.turnos.clear();
		if(data == null || idCLP == null) {
			return;
		}
		List<Turno> turnos = turnoService.buscarTurnosPelaDataCLP(data, idCLP);
		for(Turno turno : turnos) {
			this.turnos.add(new SelectItem(turno.getId(), turno.getCodigo()+ " - " + turno.getDescricao()));
		}
	}

	public void adicionaFiltroCabecalhoPDF(Object document) {
        Document doc = (Document) document;
        CLP clp = clpService.buscarPorId(idCLPConsulta);
        Turno turno = turnoService.buscarPorId(idTurnoConsulta);
        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
        HeaderFooter hf = new HeaderFooter(new Phrase("CLP: "+ clp.getNome() + " |  Data: " + sdf.format(dataConsulta) + " |  Turno: " 
        + turno.getCodigo() +" - " + turno.getDescricao()), null);
        doc.setHeader(hf);
        hf = new HeaderFooter(new Phrase("MTBF: " + getMtbfFormat()
        		+"                                                                                                                   "), null);
        doc.setFooter(hf);
    }

	public void adicionaFiltroCabecalhoXLS(Object document) {
		// Busca dados
		CLP clp = clpService.buscarPorId(idCLPConsulta);
	    Turno turno = turnoService.buscarPorId(idTurnoConsulta);
	    SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");

	    // Recupera workbook
		HSSFWorkbook wb = (HSSFWorkbook) document;
		// Pega a folha de trabalho
		Sheet sheet = wb.getSheetAt(0);

		// Muda o nome
		wb.setSheetName(wb.getSheetIndex(sheet), "Dados");

		// Move dados para baixo para adicionar o filtro no início
		sheet.shiftRows(0,sheet.getLastRowNum(), 1);
		sheet.shiftRows(0,sheet.getLastRowNum(), 1);

		// Cria linha
		Row row = sheet.createRow(0);

		// Cria estilo para destacar os dados do filtro
		CellStyle style = wb.createCellStyle();
		style.setFillBackgroundColor(IndexedColors.GREY_25_PERCENT.getIndex());

		// Adiciona dados do filtro
		Cell cell = row.createCell(0);
		cell.setCellStyle(style);
		cell.setCellValue("CLP:");
		cell = row.createCell(1);
		cell.setCellStyle(style);
		cell.setCellValue(clp.getNome());
		cell = row.createCell(2);
		cell.setCellStyle(style);
		cell.setCellValue("Data: ");
		cell = row.createCell(3);
		cell.setCellStyle(style);
		cell.setCellValue(sdf.format(dataConsulta));
		cell = row.createCell(4);
		cell.setCellStyle(style);
		cell.setCellValue("Turno");
		cell = row.createCell(5);
		cell.setCellStyle(style);
		cell.setCellValue(turno.getCodigo() +" - " + turno.getDescricao());
    }

	public List<SelectItem> getClps() {
		return clps;
	}

	public void setClps(List<SelectItem> clps) {
		this.clps = clps;
	}

	public Long getIdCLP() {
		return idCLP;
	}

	public void setIdCLP(Long idCLP) {
		this.idCLP = idCLP;
	}

	public List<SelectItem> getDatas() {
		return datas;
	}

	public void setDatas(List<SelectItem> datas) {
		this.datas = datas;
	}

	public Date getData() {
		return data;
	}

	public void setData(Date data) {
		this.data = data;
	}

	public List<SelectItem> getTurnos() {
		return turnos;
	}

	public void setTurnos(List<SelectItem> turnos) {
		this.turnos = turnos;
	}

	public Long getIdTurno() {
		return idTurno;
	}

	public void setIdTurno(Long idTurno) {
		this.idTurno = idTurno;
	}

	public CLPService getClpService() {
		return clpService;
	}

	public void setClpService(CLPService clpService) {
		this.clpService = clpService;
	}

	public EventoService getEventoService() {
		return eventoService;
	}

	public void setEventoService(EventoService eventoService) {
		this.eventoService = eventoService;
	}

	public TurnoService getTurnoService() {
		return turnoService;
	}

	public void setTurnoService(TurnoService turnoService) {
		this.turnoService = turnoService;
	}

	public List<Evento> getEventos() {
		return eventos;
	}

	public void setEventos(List<Evento> eventos) {
		this.eventos = eventos;
	}

	public Double getMtbf() {
		return mtbf;
	}

	public String getMtbfFormat() {
		if(mtbf == null) {
			return "Não registrado";
		}
		DecimalFormat df = new DecimalFormat("#,##0.00");
		return df.format(mtbf);
	}

	public void setMtbf(Double mtbf) {
		this.mtbf = mtbf;
	}


}
